package com.service;

import com.dao.OrderDao;
import com.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

//在业务层 将事务管理 委托给Spring来做
//在类上加上@Transactional 所有的方法都是这个 类上的注解@Transactional一般配置只读

/**
 * @Transactional: Spring会识别它 设置是否只读、控制事务隔离级别、事务传播行为
 */
@Service
@Transactional(readOnly = true) //加入这个注解即可 Spring就会扫描到 会去管理事务
public class BuyService {

    @Autowired
    UserDao userDao;

    @Autowired
    OrderDao orderDao;
    //在方法再加上@Transactional 可以把类上的注解@Transactional覆盖掉
    //如果方法需要新增、修改、删除操作 就需要设置readOnly=false

    /**
     * 事务隔离级别:
     * isolation = Isolation.REPEATABLE_READ
     *      可重复读
     *      多次读取相同字段的结果是一致的，防止脏读和不可重复读，可能出现幻读
     * 事务传播行为:
     * propagation = Propagation.REQUIRED
     *      默认传播行为，如果存在当前事务，则当前方法就在当前事务中运行，如果不存在，
     *      则创建一个新的事务，并在这个新建的事务中运行。
     *
     * 在并发量比较低的时候:
     * 默认readOnly=false
     * 事务的隔离级别、传播特性不加也是可以的(很多项目中都看不到这两个配置....)
     *
     */
    @Transactional(readOnly = false,isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED)
    public void buy(){
        userDao.subBalance(200);
        orderDao.createOrder();
    }

}
